package com.ThreadSyncEg;

import java.util.ArrayList;
import java.util.UUID;
import java.util.concurrent.CopyOnWriteArrayList;

//线程中 集合的不安全性
//同步操作中的不安全
public class CopyOnWriteArrayListDemo {
    public static void main(String[] args) {

        /**
         *  测试线程中集合安全性用 CopyOnWriteArrayList
         *  写时复制策略。
         *  多个线程调用同一个列表 是共同获取相同的指针指向相同的资源
         *  如果调用者没有修改资源，就不会有副本被创建，因此多个调用者只是读取操作时可以共享同一份资源
         *
         *  用于读多写少的并发场景
         *
         * */
        CopyOnWriteArrayList<Object> writeArrayList = new CopyOnWriteArrayList<>();

        ArrayList<String> list = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            new Thread(()->{
                synchronized (writeArrayList){//加锁后 数据添加稳定
                    writeArrayList.add(UUID.randomUUID().toString().substring(0,5));//substring(0,5) 截取
                }
            }).start();
        }
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(writeArrayList);
    }
}
